package io.gitee.thinkbungee.entity.mongo;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import io.gitee.thinkbungee.adaptor.MongoTableInfoAdaptor;
import io.gitee.thinkbungee.utils.mongo.MongoType;
import lombok.Data;

import java.io.Serializable;
import java.util.*;

/**
 * 解析mongo表的内容
 *
 * @author chenyichang
 * @date 2022/3/9
 */
@Data
public class MongoDefinition implements Serializable {

    /**
     * 属性名
     */
    private String propertyName;
    /**
     * 属性类型 对应MongoDB api $type
     * 如果没有类型，表示这是一个顶层实体，而不是内嵌属性
     */
    private Integer type;
    /**
     * 此属性是否是数组
     */
    private boolean array = false;
    /**
     * 如果该属性是对象，他的子类
     */
    private List<MongoDefinition> child;

    /**
     * 获取child信息
     *
     * @param tableName 表名
     * @return 返回的列表，第一个元素是该table的信息
     */
    public List<MongoGeneratorEntity> getChildrenInfo(String tableName) {
        List<MongoGeneratorEntity> result = new ArrayList<>();
        MongoGeneratorEntity info = new MongoGeneratorEntity();
        //表信息
        Map<String, String> tableInfo = MongoTableInfoAdaptor.tableInfo(tableName);
        //列名信息
        List<Map<String, String>> columnsInfo = new ArrayList<>();

        info.setColumns(columnsInfo);
        info.setTableInfo(tableInfo);
        result.add(info);

        List<MongoDefinition> child = this.getChild();
        for (MongoDefinition md : child) {
            Map<String, String> columnInfo = new HashMap<>(5);
            columnInfo.put("columnName", md.getPropertyName());
            columnInfo.put("dataType", MongoType.typeInfo(md.getType()));
            columnInfo.put("extra", md.isArray() ? "array" : "");
            columnsInfo.add(columnInfo);
            //递归
            if (md.hasChild()) {
                result.addAll(md.getChildrenInfo(md.getPropertyName()));
            }
        }
        return result;
    }

    public boolean hasChild() {
        return type == null || Objects.equals(3, type)
                || CollectionUtils.isNotEmpty(child);
    }
}
